package es.tikitaka.actions.sanciones;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.End;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelection;
import org.jboss.seam.faces.FacesMessages;

import es.tikitaka.dao.EquipoService;
import es.tikitaka.dao.JornadaService;
import es.tikitaka.dao.PosicionDicService;
import es.tikitaka.dao.RondaDicService;
import es.tikitaka.dao.SancionService;
import es.tikitaka.dao.TemporadaService;
import es.tikitaka.dictionary.PosicionDic;
import es.tikitaka.dictionary.RondaDic;
import es.tikitaka.domain.Sancion;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.equipo.Equipo;
import es.tikitaka.domain.liga.Jornada;
import es.tikitaka.domain.playoffs.Ronda;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("sancionesSearch")
@Scope(ScopeType.CONVERSATION)
public class SancionSearch {

	private int modo;

	private String nombre;
	private String apellidos;
	private Integer edad;
	private Temporada temporada;
	private Jornada jornada;
	private Ronda ronda;
	private Equipo equipo;
	private PosicionDic posicion;

	private List<Temporada> listaTemporadas;
	private List<Jornada> listaJornadas;
	private List<Ronda> listaRondas;
	private List<Equipo> listaEquipos;
	private List<PosicionDic> listaPosiciones;

	@DataModel("sanciones")
	private List<Sancion> sanciones;

	private int totalRes;

	@In(create = true)
	private PosicionDicService posicionService;

	@In(create = true)
	private EquipoService equipoService;

	@In(create = true)
	private TemporadaService temporadaService;

	@In(create = true)
	private RondaDicService rondaDicService;

	@In(create = true)
	private SancionService sancionService;

	/**
	 * Constructor por defecto
	 */
	public SancionSearch() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de edición
	 */
	@Begin(join = true, flushMode = FlushModeType.MANUAL)
	public void modoEdicion() {
		modo = 1;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de consulta
	 */
	public void modoConsulta() {
		modo = 2;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que inicializa la variable modo para que en la pantalla de
	 * búsqueda se cargen las opciones de levantar
	 */
	public void modoLevantar() {
		modo = 3;
		cargaOpcionesBusqueda();
	}

	/**
	 * Método que carga las opciones en la pantalla de búsqueda de jugadores
	 */
	public void cargaOpcionesBusqueda() {
		listaPosiciones = posicionService.getList();
		listaEquipos = equipoService.getList();
		listaTemporadas = temporadaService.getList();
	}

	/**
	 * Método para buscar jugadores según los criterios de consulta
	 */
	@Begin(join = true)
	public void buscar() {
		if (temporada != null) {
			StringBuffer s = new StringBuffer();

			s.append("select s from Sancion s join fetch s.jugador p ");
			s.append("where p.temporada.id = ?1 ");
			if (modo == 1 || modo == 3) {
				// las sanciones a buscar son las activas
				s.append("and s.activa = 'true' ");
			}
			if (nombre != null && nombre.length() > 0) {
				s
						.append("and upper(p.jugador.nombre) like upper('%'||?2||'%') ");
			}
			if (apellidos != null && apellidos.length() > 0) {
				s
						.append("and upper(p.jugador.apellidos) like upper('%'||?3||'%') ");
			}
			if (edad != null) {
				s.append("and p.edad = ?4 ");
			}
			if (equipo != null) {
				s.append("and p.equipo.equipo.id = ?5 ");
			}
			if (jornada != null) {
				s.append("and s.jornadaSancion.id = ?6 ");
			}
			if (ronda != null) {
				s.append("and s.rondaSancion.id = ?7 ");
			}
			if (posicion != null) {
				s.append("and p.posicion.id = ?8 ");
			}
			s.append("order by p.jugador.apellidos, p.jugador.nombre");
			sanciones = sancionService.buscar(s, temporada, nombre, apellidos,
					jornada, ronda, equipo, edad, posicion);
			totalRes = sanciones.size();

		} else {
			FacesMessages
					.instance()
					.add(
							"Es necesario seleccionar una temporada para ver las sanciones");
		}
	}

	@Begin(join = true)
	public void cleanRondas() {
		if (jornada != null) {
			ronda = null;
			listaRondas = new ArrayList<Ronda>();
		}
	}

	@Begin(join = true)
	public void cleanJornadas() {
		if (ronda != null) {
			jornada = null;
			listaJornadas = new ArrayList<Jornada>();
		}
	}

	public void cleanJornadaRonda() {
		if (temporada == null) {
			listaJornadas = null;
			jornada = null;
			ronda = null;
		}
	}

	/**
	 * Método para limpiar los criterios de búsqueda del formulario
	 */
	public void limpiar() {
		nombre = null;
		apellidos = null;
		temporada = null;
		equipo = null;
		edad = null;
		posicion = null;
		sanciones = null;
	}

	/**
	 * Método para inicializar todos los parámetros al volver al menú de
	 * sanciones0
	 */
	@End
	public void volver() {
		limpiar();
	}

	/**
	 * Método para inicializar todos los parámetros al volver al menú principal
	 */
	@End
	public void menu() {
		limpiar();
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return
	 */
	public int getModo() {
		return modo;
	}

	/**
	 * 
	 * @param modo
	 */
	public void setModo(int modo) {
		this.modo = modo;
	}

	/**
	 * 
	 * @return
	 */
	public String getNombre() {
		return nombre;
	}

	/**
	 * 
	 * @param nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * 
	 * @return
	 */
	public String getApellidos() {
		return apellidos;
	}

	/**
	 * 
	 * @param apellidos
	 */
	public void setApellidos(String apellidos) {
		this.apellidos = apellidos;
	}

	/**
	 * 
	 * @return
	 */
	public Integer getEdad() {
		return edad;
	}

	/**
	 * 
	 * @param edad
	 */
	public void setEdad(Integer edad) {
		this.edad = edad;
	}

	/**
	 * 
	 * @return
	 */
	public Temporada getTemporada() {
		return temporada;
	}

	/**
	 * 
	 * @param temporada
	 */
	public void setTemporada(Temporada temporada) {
		this.temporada = temporada;
	}

	/**
	 * 
	 * @return
	 */
	public Jornada getJornada() {
		return jornada;
	}

	/**
	 * 
	 * @param jornada
	 */
	public void setJornada(Jornada jornada) {
		this.jornada = jornada;
	}

	/**
	 * 
	 * @return
	 */
	public Ronda getRonda() {
		return ronda;
	}

	/**
	 * 
	 * @param ronda
	 */
	public void setRonda(Ronda ronda) {
		this.ronda = ronda;
	}

	/**
	 * 
	 * @return
	 */
	public Equipo getEquipo() {
		return equipo;
	}

	/**
	 * 
	 * @param equipo
	 */
	public void setEquipo(Equipo equipo) {
		this.equipo = equipo;
	}

	/**
	 * 
	 * @return
	 */
	public PosicionDic getPosicion() {
		return posicion;
	}

	/**
	 * 
	 * @param posicion
	 */
	public void setPosicion(PosicionDic posicion) {
		this.posicion = posicion;
	}

	/**
	 * 
	 * @return
	 */
	public List<Temporada> getListaTemporadas() {
		return listaTemporadas;
	}

	/**
	 * 
	 * @param listaTemporadas
	 */
	public void setListaTemporadas(List<Temporada> listaTemporadas) {
		this.listaTemporadas = listaTemporadas;
	}

	/**
	 * 
	 * @return
	 */
	public List<Jornada> getListaJornadas() {
		if (temporada != null) {
			listaJornadas = new ArrayList<Jornada>();
			listaJornadas.addAll(temporada.getLiga().getCalendario()
					.getM_jornadas());
			Collections.sort(listaJornadas);
		}
		return listaJornadas;
	}

	/**
	 * 
	 * @param listaJornadas
	 */
	public void setListaJornadas(List<Jornada> listaJornadas) {
		this.listaJornadas = listaJornadas;
	}

	/**
	 * 
	 * @return
	 */
	public List<Ronda> getListaRondas() {
		if (temporada != null) {
			if (temporada.getPlayoffs() != null
					&& temporada.getPlayoffs().getCalendario() != null
					&& temporada.getPlayoffs().getCalendario().getM_rondas() != null) {
				listaRondas = new ArrayList<Ronda>();
				listaRondas.addAll(temporada.getPlayoffs().getCalendario()
						.getM_rondas());
			}
		}
		return listaRondas;
	}

	/**
	 * 
	 * @param listaRondas
	 */
	public void setListaRondas(List<Ronda> listaRondas) {
		this.listaRondas = listaRondas;
	}

	/**
	 * 
	 * @return
	 */
	public List<Equipo> getListaEquipos() {
		return listaEquipos;
	}

	/**
	 * 
	 * @param listaEquipos
	 */
	public void setListaEquipos(List<Equipo> listaEquipos) {
		this.listaEquipos = listaEquipos;
	}

	/**
	 * 
	 * @return
	 */
	public List<PosicionDic> getListaPosiciones() {
		return listaPosiciones;
	}

	/**
	 * 
	 * @param listaPosiciones
	 */
	public void setListaPosiciones(List<PosicionDic> listaPosiciones) {
		this.listaPosiciones = listaPosiciones;
	}

	/**
	 * 
	 * @return
	 */
	public List<Sancion> getSanciones() {
		return sanciones;
	}

	/**
	 * 
	 * @param sanciones
	 */
	public void setSanciones(List<Sancion> sanciones) {
		this.sanciones = sanciones;
	}

	/**
	 * 
	 * @return
	 */
	public int getTotalRes() {
		return totalRes;
	}

	/**
	 * 
	 * @param totalRes
	 */
	public void setTotalRes(int totalRes) {
		this.totalRes = totalRes;
	}

}
